\documentclass[a4paper, 11pt]{article}


\usepackage[francais]{babel}	% Langue
\usepackage[utf8]{inputenc}	% Encodage du texte
\usepackage[T1]{fontenc}		% Encodage de police
\usepackage{lmodern}			% Police

%\usepackage{textcomp}		% Symboles
%\usepackage{url}			% URLs
\usepackage{graphicx}		% Images
%\usepackage[empty]{fullpage}	% Pleine page
%\usepackage{nopageno}		% Pagination
%\usepackage{multirow}		% Tableau complexe
%\usepackage{caption}
%\usepackage{array}


\title{Hexxagon\\SCS}
\author{\bsc{Boujedli} Najim \and \bsc{Paneri} Jérémy}
\date{Master 1 Informatique\\ 2012 -- 2013}

\begin{document}
\maketitle

\begin{figure}[b]
   \centering\includegraphics[scale=0.2]{ufc.png}
\end{figure}

\thispagestyle{empty}
\newpage


% CONTENU %


\section{Présentation générale}

Hexxagon est un jeu de plateau, dans lequel s'affrontent deux joueurs devant occuper un maximum de cases sur le terrain.
Chaque joueur a la possibilité d'utiliser une intelligence artificielle pour calculer son prochain coup.
Pour éviter les tricheries, tous les coups des joueurs devront passer par l'arbitre, en suivant un protocole donné.

Dans ce rapport, nous nous concentrerons uniquement sur l'aspect «communication» des différents protagonistes présentés.

\section{Communication entre le joueur et l'arbitre}

%\subsection{Le protocole utilisé}
Un protocole de communication nous a été fourni afin de pouvoir communiquer avec l'arbitre.
Sa description complète nous a été donnée dans le sujet, nous n'avons eu qu'à l'appliquer à la lettre.

\section{Communication entre le joueur et le moteur IA}
Pour communiquer avec le moteur IA, nous avons décidé d'envoyer des messages à l'aide de sockets, en établissant le moteur IA comme serveur. Il attend ainsi que le joueur s'y connecte pour pouvoir commencer les échanges.

Les messages sont envoyés sous forme de chaînes de caractères, ce qui évite de transformer les informations lors de leur envoi et de leur réception, compte tenu de la différence des langages de programmation.

\subsection{En général}
Nous devons faire communiquer le joueur et son IA : le joueur doit envoyer le coup que son adversaire a joué (pour être à jour sur les cases jouables), et recevoir de l'IA le nouveau coup calculé qu'il renverra à l'arbitre.

Du côté du joueur, le type \texttt{TypCoupReq} est transformé en chaîne de caractères par la fonction \texttt{coupToString} pour être envoyée au serveur.
La fonction inverse \texttt{stringToCoup} a également été nécessaire pour créer un coup  à partir de la chaîne envoyée par l'IA, pouvant être envoyé à l'arbitre.

Du côté du moteur IA, les fonctions \texttt{stringToSPTerm} et \texttt{spTermToSring} permettent de convertir la chaîne reçue du joueur en objet Prolog et réciproquement.


\subsection{Cas particulier}
	\subsubsection{La couleur du joueur}
La couleur du joueur doit être établie une seule fois pour toutes les parties qu'il fera avec le même adversaire.
En effet, selon la couleur, le plateau initial nécessaire au calcul du coup est différent.
A chaque début de partie, l'IA doit donc garder le même plateau de départ pour une couleur donnée. Voilà comment nous procédons :

Nous créons et connectons les deux sockets.
Une fois la partie établie avec l'arbitre, nous pouvons savoir qui commence, et de ce fait, envoyer à l'IA cette 1\iere\ information, qui permet de déterminer la couleur des pions du joueur.

	\subsubsection{Le 1\ier\ coup}
	Maintenant que l'IA sait quelle est sa couleur, il lui faut savoir s'il débute ou non la partie : le joueur du premier coup avertit l'IA avec le caractère «\texttt{a}», signifiant qu'il commence la partie.

	\subsubsection {La fin de partie}
	À chaque réception d'une réponse de l'arbitre, nous vérifions qu'il ne s'agit pas d'un cas d'erreur, et, si le coup est valide, qu'il s'agit d'un coup non gagnant ou perdant.
Si tel est le cas, nous renvoyons immédiatement un caractère spécial «\texttt{o}» pour demander au moteur IA de se réinitialiser pour une prochaine partie.

	\subsubsection {La fin de tournoi}
	De la même manière, à la fin du tournoi, nous envoyons le caractère «\texttt{n}» pour demander au moteur IA de quitter complètement la zone de calcul, et d'interrompre toutes les communications.

\section{Explications concernant la structure de mon joueur}

Avant d'entrer dans une boucle permettant de gérer l'arrêt du tournoi, les connexions à l'arbitre et au moteur IA doivent être établies.
L'identification du joueur et une première partie doivent être demandées à l'arbitre. La couleur et le tour du joueur (premier ou deuxième) sont établis ici.

Nous rentrons alors dans une double boucle imbriquée : une première boucle ne s'interrompant qu'en fin de tournoi ; la deuxième, à chaque fin de partie.
Elles sont interrompues en modifiant un «booléen» à chaque nouvelle partie ou à la réception d'une fin de tournoi par l'arbitre.
\end{document}
